#include "TaskQueue.h"

TaskQueue::TaskQueue(size_t queSize)
    : _queSize(queSize), _que(), _mutex(), _notFull(), _notEmpty() {}

bool TaskQueue::empty()
{
    return 0 == _que.size();
}
bool TaskQueue::full()
{
    return _queSize == _que.size();
}

TaskQueue::~TaskQueue()
{
}
void TaskQueue::push(ElemType ptask)
{
    unique_lock<mutex> ul(_mutex);
    while (full())
    {
        _notFull.wait(ul);
    }
    _que.push(ptask);
    _notEmpty.notify_one();
}
ElemType TaskQueue::pop()
{
    unique_lock<mutex> ul(_mutex);
    while (empty() && flag)
    {
        _notEmpty.wait(ul);
    }
    if (flag)
    {
        ElemType temp = _que.front();
        _que.pop();
        _notFull.notify_one();
        return temp;
    }
    else
    {
        return nullptr;
    }
}
void TaskQueue::wakeup()
{
    flag = false;
    _notEmpty.notify_all();
}
